Pointer Arithmetics
Wir haben bereits gelernt, was ein Zeiger ist und wie man mit ihnen umgeht. In diesem Tutorial werden wir über arithmetische Operationen Operationen an Zeigern lernen. Diese Operationen sind: ++, --, -, +
Einen Zeiger mit ++ inkrementieren
Der ++ Operator erhöht den Wert einer Variable. In diesem Fall ist unsere Variable ein Zeiger, was bedeutet, dass wir die Adresse im Speicher, auf die der Zeiger verweist, erhöhen. In diesem Beispiel kombinieren wir diese Operation mit einem Array:
#include <stdio.h>
int main()
{
int intarray[5] = {10,20,30,40,50};
int i;
for(i = 0; i < 5; i++)
printf("intarray[%d] hat den Wert %d - und Adresse @ %x\n", i, intarray[i], &intarray[i]);
int *intpointer = &intarray[3]; // zeige zum 4ten Element des Arrays
printf("Adresse: %x - hat den Wert %d\n", intpointer, *intpointer); // gib die Adresse des 4ten Elements aus
intpointer++; // jetzt erhoehe die Adresse des Zeigers, sodass er auf das 5te Element zeigt
printf("Adresse: %x - hat den Wert %d\n", intpointer, *intpointer); // gib die Adresse des 5ten Elements aus
return 0;
}
Einen Zeiger mit -- verringern
Wie in dem vorherigen Beispiel, in dem wir die Adresse des Zeigers mit ++ erhöht haben, können wir sie mit dem -- Operator verringern.
#include <stdio.h>
int main()
{
int intarray[5] = {10,20,30,40,50};
int i;
for(i = 0; i < 5; i++)
printf("intarray[%d] hat den Wert %d - und die Adresse @ %x\n", i, intarray[i], &intarray[i]);
int *intpointer = &intarray[4]; // zeige zum 5ten Element des Arrays
printf("Adresse: %x - hat den Wert %d\n", intpointer, *intpointer); // gib die Adresse des 5ten Elements aus
intpointer--; // jetzt verringere die Adresse des Zeigers, sodass er auf das 4te Element zeigt
printf("Adresse: %x - hat den Wert %d\n", intpointer, *intpointer); // gib die Adresse des 4ten Elements aus
return 0;
}
Zeiger addieren mit +
Zuvor haben wir die Adresse eines Zeigers um 1 erhöht. Wir können ihn aber auch um eine beliebige Ganzzahl erhöhen:
#include <stdio.h>
int main()
{
int intarray[5] = {10,20,30,40,50};
int i;
for(i = 0; i < 5; i++)
printf("intarray[%d] hat den Wert %d - und die Adresse @ %x\n", i, intarray[i], &intarray[i]);
int *intpointer = &intarray[1]; // zeige zum 2ten Element des Arrays
printf("Adresse: %x - hat den Wert %d\n", intpointer, *intpointer); // gib die Adresse des 2ten Elements aus
intpointer += 2; // jetzt verschieben wir die Adresse des Zeigers um 2 Stellen, sodass er zum 4ten Element zeigt
printf("Adresse: %x - hat den Wert %d\n", intpointer, *intpointer); // gib die Adresse des 4ten Elements aus
return 0;
}
Beachte, das die Ausgabe der Adressen um 8 Schritte im Speicher verschoben wurde. Du fragst dich vielleicht warum. Die Antwort ist einfach: Unser Zeiger ist ein Ganzzahl(integer)-Zeiger. Die Größe einer Ganzzahl im Speicher ist 4 Bytes und wird mit jedem Mal um jeweils 4 Bytes verschoben. In unserem Code verschieben wir die Adresse des Zeigers um 2, sodass die neue Adresse um 2 x 4 Bytes = 8 von der Ausgangsadresse abweicht.
Zeiger subtrahieren mit -
Auf ähnliche Weise können wir subtrahieren:
#include <stdio.h>
int main()
{
int intarray[5] = {10,20,30,40,50};
int i;
for(i = 0; i < 5; i++)
printf("intarray[%d] hat den Wert %d - und die Adresse @ %x\n", i, intarray[i], &intarray[i]);
int *intpointer = &intarray[4]; // zeige zum 5ten Element im Array
printf("Adresse: %x - hat den Wert %d\n", intpointer, *intpointer); // gib die Adresse des 5ten Elements aus
intpointer -= 2; // jetzt verschieben wir die Adresse des Zeigers um 2 Stellen, sodass es zum 3ten Element zeigt
printf("Adresse: %x - hat den Wert %d\n", intpointer, *intpointer); // gib die Adresse des 3ten Elements aus
return 0;
}
Auch hier wurde die Adresse um 4 Byte Blöcke verschoben (bei Ganzzahlzeigern )
Andere Operationen
Es gibt noch mehr Operationen, zum Beispiel die Vergleiche >, <, ==. Die Idee ist ähnlich wie beim Vergleichen von Variablen, allerdings werden hier die Speicheradressen verglichen.
Übung
Erstelle einen Zeiger, der in die Mitte des intArray
zeigt und gib die Adresse jedes Elements aus, angefangen von der Mitte.